﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ATEC.ATCore;
using ATEC.ATDataCoreNET;
using ATEC.ATDataCoreNET.ATObjects;
using ATEC.GeometryNET;

/// <summary>
/// 文件名：PatternMethod.cs
/// 分类：玄镜BIM图形平台/C#开发/示例代码/图案填充
/// 
/// 功能概述：
/// 展示玄镜BIM平台中的图案填充功能，包括线型填充和自定义图案填充两种方式。
/// 
/// 填充功能：
/// 1. 线型填充：
///    - 基本线型填充
///    - 角度控制
///    - 间距设置
///    - 双向填充
/// 
/// 2. 自定义图案填充：
///    - 自定义填充线定义
///    - 图案方向控制
///    - 图案间距设置
///    - 岛洞处理
/// 
/// 关键类和工具：
/// 1. 填充类：
///    - XShapeObject：形状对象类，作为填充载体
///    - AreaFillPropertiesEdit：区域填充属性编辑类
///    - PatternParams：填充参数类
///    - DwgHatchDefLine：填充线定义类
/// 
/// 2. 几何类：
///    - XPoint3d：三维点类，定义填充边界
///    - XAngle：角度类，控制填充方向
///    - XMatrix3d：矩阵类，控制填充变换
/// 
/// 使用场景：
/// 1. 区域填充效果展示
/// 2. 自定义图案设计
/// 3. 建筑图纸填充样式
/// 
/// 注意事项：
/// 1. 填充边界必须闭合
/// 2. 填充参数需要合理设置
/// 3. 注意填充密度和性能平衡
/// 4. 岛洞填充需要特殊处理
/// </summary>
namespace PatternExample
{
    /// <summary>
    /// 类名：PatternMethod
    /// 分类：玄镜BIM图形平台/C#开发/示例代码/图案填充
    /// 
    /// 功能：提供图案填充的各种实现方法
    /// 
    /// 关键类：
    /// - XShapeObject：形状对象类，用于创建填充区域
    /// - AreaFillPropertiesEdit：填充属性编辑类
    /// - PatternParams：填充参数配置类
    /// 
    /// 方法说明：
    /// - FillPatternByLine：基本线型填充
    /// - FillByPatHatchLine：自定义图案填充
    /// </summary>
    public class PatternMethod
    {
        /// <summary>
        /// 方法名：FillPatternByLine
        /// 功能：使用基本线型进行区域填充
        /// 
        /// 关键类：
        /// - XShapeObject：形状对象类，创建填充边界
        /// - AreaFillPropertiesEdit：填充属性编辑类
        /// - PatternParams：填充参数类
        /// - XPoint3d：三维点类，定义边界顶点
        /// 
        /// 处理流程：
        /// 1. 创建填充边界：
        ///    - 定义四个顶点
        ///    - 创建ShapeObject对象
        /// 
        /// 2. 设置填充参数：
        ///    - 主填充间距(PrimarySpacing)
        ///    - 主填充角度(PrimaryAngle)
        ///    - 次填充间距(SecondarySpacing)
        ///    - 次填充角度(SecondaryAngle)
        /// 
        /// 3. 执行填充：
        ///    - 添加填充图案
        ///    - 添加到场景
        /// 
        /// 参数说明：
        /// - PrimarySpacing：1000，主填充线间距
        ///   - 单位：毫米
        ///   - 作用：控制主方向填充线之间的距离
        ///   - 数值越小，填充越密集
        /// 
        /// - PrimaryAngle：0.25π，主填充线角度
        ///   - 单位：弧度
        ///   - 作用：控制主填充线的方向
        ///   - 以水平方向为基准，按弧度值旋转
        /// 
        /// - SecondarySpacing：1000，次填充线间距
        ///   - 单位：毫米
        ///   - 作用：控制次方向填充线之间的距离
        ///   - 与主填充线配合形成网格效果
        /// 
        /// - SecondaryAngle：-0.25π，次填充线角度
        ///   - 单位：弧度
        ///   - 作用：控制次填充线的方向
        ///   - 以水平方向为基准，按弧度值旋转
        /// 
        /// 填充效果：
        /// - 主次填充线可形成网格图案
        /// - 网格大小由Spacing参数决定
        /// - 网格形状由Angle参数决定
        /// 
        /// 注意事项：
        /// 1. 确保边界完全闭合
        /// 2. 填充参数需要合理设置
        /// 3. 注意填充角度的单位(弧度)
        /// </summary>
        public static void FillPatternByLine()
        {
            //创建ShapeObj
            XPoint3d pt1 = XPoint3d.FromXYZ(-10000, 10000, 0);
            XPoint3d pt2 = XPoint3d.FromXYZ(-10000, -10000, 0);
            XPoint3d pt3 = XPoint3d.FromXYZ(10000, -10000, 0);
            XPoint3d pt4 = XPoint3d.FromXYZ(10000, 10000, 0);
            XPoint3d[] points = { pt1, pt2, pt3, pt4 };
            XShapeObject shapeObj = new XShapeObject(Session.Entity.GetActiveATScenes(), null, points);

            //设置填充参数
            AreaFillPropertiesEdit fillEdit = shapeObj.AsAreaFillPropertiesEdit();
            PatternParams patternParams = new PatternParams();
            if(null == patternParams)
                return;

            patternParams.PrimarySpacing = 1000;
            patternParams.PrimaryAngle = (XAngle.PI * 0.25).Radians;
            patternParams.SecondarySpacing = 1000;
            patternParams.SecondaryAngle = (-XAngle.PI * 0.25).Radians;
            patternParams.Tolerance = 0;

            //填充图案
            fillEdit.AddPattern(patternParams, null, 0);
            fillEdit.AddToScene();
        }

        /// <summary>
        /// 方法名：FillByPatHatchLine
        /// 功能：使用自定义图案进行区域填充
        /// 
        /// 关键类：
        /// - XShapeObject：形状对象类，创建填充边界
        /// - AreaFillPropertiesEdit：填充属性编辑类
        /// - PatternParams：填充参数类
        /// - DwgHatchDefLine：填充线定义类，定义自定义图案
        /// - XMatrix3d：矩阵类，控制图案方向
        /// 
        /// 处理流程：
        /// 1. 创建填充边界：
        ///    - 定义四个顶点
        ///    - 创建ShapeObject对象
        /// 
        /// 2. 设置基本参数：
        ///    - 方向矩阵(Orientation)
        ///    - 偏移量(Offset)
        ///    - 颜色索引(Color)
        ///    - 填充线数量(DwgNDefLines)
        ///    - 岛洞样式(DwgIslandStyle)
        ///    - 像素大小(DwgPixelSize)
        /// 
        /// 3. 定义填充线：
        ///    - 创建水平填充线
        ///    - 创建垂直填充线
        ///    - 设置线段间距和偏移
        /// 
        /// 4. 执行填充：
        ///    - 添加填充图案
        ///    - 添加到场景
        /// 
        /// 参数说明：
        /// - DwgNDefLines：2，填充线定义数量
        /// - DwgIslandStyle：0，岛洞处理方式
        /// - Color：2，填充线颜色索引
        /// 
        /// 填充线参数：
        /// 1. 水平线：
        ///    - 角度：0
        ///    - 起点：(0, 0)
        ///    - 终点：(0, 2000)
        ///    - 间距：[2000, -2000]
        /// 
        /// 2. 垂直线：
        ///    - 角度：π/2
        ///    - 起点：(0, 0)
        ///    - 终点：(2000, 0)
        ///    - 间距：[2000, -2000]
        /// 
        /// 注意事项：
        /// 1. 确保边界完全闭合
        /// 2. 填充线定义需要合理
        /// 3. 注意填充线的方向和间距
        /// 4. 岛洞处理方式的选择
        /// 5. 性能与填充密度的平衡
        /// </summary>
        public static void FillByPatHatchLine()
        {
            //创建ShapeObj
            XPoint3d pt1 = XPoint3d.FromXYZ(-10000, 10000, 0);
            XPoint3d pt2 = XPoint3d.FromXYZ(-10000, -10000, 0);
            XPoint3d pt3 = XPoint3d.FromXYZ(10000, -10000, 0);
            XPoint3d pt4 = XPoint3d.FromXYZ(10000, 10000, 0);
            XPoint3d[] points = { pt1, pt2, pt3, pt4 };
            XShapeObject shapeObj = new XShapeObject(Session.Entity.GetActiveATScenes(), null, points);

            //设置填充参数
            AreaFillPropertiesEdit fillEdit = shapeObj.AsAreaFillPropertiesEdit();
            PatternParams patternParams = new PatternParams();
            if (null == patternParams)
                return;
            patternParams.Orientation = XMatrix3d.Identity;
            patternParams.Offset = XPoint3d.Zero;
            patternParams.Color = 2;
            patternParams.DwgNDefLines = 2;
            patternParams.DwgIslandStyle = 0;
            patternParams.DwgPixelSize = 0;

            DwgHatchDefLine[] hatchLines = new DwgHatchDefLine[2];
            hatchLines[0] = new DwgHatchDefLine(0, new XPoint2d(0, 0), new XPoint2d(0, 2000), new double[2] { 2000, -2000 });
            hatchLines[1] = new DwgHatchDefLine(3.1415926 * 0.5, new XPoint2d(0, 0), new XPoint2d(2000, 0), new double[2] { 2000, -2000 });




            //填充图案
            fillEdit.AddPattern(patternParams, hatchLines, 0);
            fillEdit.AddToScene();
        }
    }
}
